package com.rose.redis._stand_alone_cache;

/**
 * <p>
 * 缓存问题的解决方案
 * </p>
 *
 * @author: zhu.chen
 * @date: 2021/1/14
 * @version: v1.0.0
 */
public class CacheQuestionSolution {

    /**
     * 缓存击穿
     * <p>
     * 解决方案：
     * 多个线程同时去查询数据库的这条数据，我们可以在第一个查询数据的请求上使用一个互斥锁来锁住它。其他的线程走到这一步拿不到锁就等着，等第一个线程查询到了数据，然后做缓存。
     * 后面的线程进来发现已经有缓存了，就直接走缓存。
     */
    public void cacheBreakdown() {
        // 1：线程T1、T2并发先查缓存，则缓存无数据。
        /**
         *
         * // 查缓存
         * String value = getFromRedis(key);
         * if (!StringUtils.isEmpty(value)) {
         *     return value;
         * }
         * // 加锁防止DB的并发
         * lock.lock;
         * // 再次从Redis查数据，做认证。
         * value = getFromRedis(key);
         * if (!StringUtils.isEmpty(value)) {
         *     return value;
         * }
         * // 若Redis查不到则从Db拿数据
         * value = getFromDb(key);
         * // 将Db中查到的数据放入Redis
         * setValueToRedis(value);
         * return value;
         */
    }

    /**
     * 缓存穿透
     * 解决方案：布隆过滤器
     */
    public void cachePenetrate() {
        /**
         * boolean flag = bloomFiler.contains(key)
         * if (!flag) {
         *     return;
         * }
         * // 注：布隆过滤器判断返回为true时，则key可能存在，因此需要从缓存+DB中查询下，若还是查不到key，则将该误判key添加到bloomFiler
         * String value = getFromRedis(key);
         * if (!StringUtils.isEmpty(value)) {
         *      return value;
         * }
         * value = getFromDb(key);
         * setValueToRedis(value);
         * return value;
         */

    }

    /**
     * 缓存雪崩
     * 解决方案：Redis高可用 + Hystrix等对DB做限流 + Redis的数据恢复
     */
    public void cacheAvalanche() {
        /**
         *
         * @Hystrix
         * getFromDb(key);
         *
         */
    }


}
